package org.example.classtopia.Controller;

import org.example.classtopia.Common.Result.Result;
import org.example.classtopia.Model.dto.PostCreateDTO;
import org.example.classtopia.Model.dto.PostUpdateDTO;
import org.example.classtopia.Model.vo.PageResultVO;
import org.example.classtopia.Model.vo.PostPreviewVO;
import org.example.classtopia.Model.vo.PostVO;
import org.example.classtopia.Model.Entity.Post;
import org.example.classtopia.Service.PostService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.example.classtopia.Model.vo.MyPostSimpleVO;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 帖子管理接口
 * 
 * 提供帖子创建、查询、修改、删除、分页、作者查询、分类查询、关键词搜索等功能。
 * 
 * - 创建帖子：POST /posts
 * - 查询单个帖子：GET /posts/{id}
 * - 查询作者所有帖子：GET /posts/author/{authorId}
 * - 修改帖子：PUT /posts
 * - 删除帖子：DELETE /posts/{id}
 * - 分页获取所有帖子预览：GET /posts
 * - 关键词搜索帖子：GET /posts/search
 * - 按分类分页查询帖子：GET /posts/category/{categoryId}
 * 
 * 所有接口均返回统一响应结构，包含 code、msg、data 字段。
 */
@RestController
@RequestMapping("/posts")
public class PostController {

    @Autowired
    private PostService postService;

    /**
     * 创建帖子
     * @param postCreateDTO 帖子创建参数
     * @return 创建成功的帖子信息
     */
    @PostMapping
    public Result<PostVO> createPost(@RequestBody PostCreateDTO postCreateDTO) {
        if (postCreateDTO.getAuthorId() == null) {
            return Result.error(400, "作者ID不能为空");
        }
        if (!StringUtils.hasText(postCreateDTO.getTitle())) {
            return Result.error(400, "标题不能为空");
        }
        if (!StringUtils.hasText(postCreateDTO.getContent())) {
            return Result.error(400, "内容不能为空");
        }

        try {
            Post post = postService.createPost(postCreateDTO);
            if (post == null) {
                return Result.error(500, "帖子创建失败");
            }
            PostVO postVO = postService.getPostById(post.getId());
            return Result.success("创建成功", postVO);
        } catch (Exception e) {
            return Result.error("服务器内部错误：" + e.getMessage());
        }
    }

    /**
     * 根据ID查询帖子详情
     * @param id 帖子ID
     * @return 帖子详情
     */
    @GetMapping("/{id}")
    public Result<PostVO> getPostById(@PathVariable Long id) {
        try {
            PostVO postVO = postService.getPostById(id);
            if (postVO == null) {
                return Result.error(404, "帖子不存在");
            }
            return Result.success("查询成功", postVO);
        } catch (Exception e) {
            return Result.error("服务器内部错误：" + e.getMessage());
        }
    }

    /**
     * 分页查询指定作者的帖子
     * @param authorId 作者ID
     * @param pageNum 页码
     * @param pageSize 每页数量
     * @return 分页结果
     */
    @GetMapping("/author/{authorId}")
    public Result<PageResultVO<PostVO>> getPostsByAuthorId(
            @PathVariable Long authorId,
            @RequestParam(defaultValue = "1") int pageNum,   // 习惯页码1开始
            @RequestParam(defaultValue = "10") int pageSize) {
        try {
            PageResultVO<PostVO> pageResult = postService.getPostsByAuthorId(authorId, pageNum, pageSize);
            return Result.success("查询成功", pageResult);
        } catch (Exception e) {
            return Result.error("服务器内部错误：" + e.getMessage());
        }
    }


    /**
     * 修改帖子
     * 功能说明：
     * - 必须传入想要修改的帖子的id。
     * - 其余字段（如标题、内容、分类等）可选，前端只需传入想要修改的内容。
     * - 如果某字段未传或为null，则该字段不会被修改，仍保留原值。
     * - 仅对有传入的字段进行更新。
     *
     * @param postUpdateDTO 修改参数，必须包含id，其余字段可选
     * @return 是否成功
     */
    @PutMapping
    public Result<Boolean> updatePost(@RequestBody PostUpdateDTO postUpdateDTO) {
        if (postUpdateDTO.getId() == null) {
            return Result.error(400, "帖子ID不能为空");
        }
        try {
            boolean updated = postService.updatePost(postUpdateDTO);
            if (!updated) {
                return Result.error(500, "更新失败");
            }
            return Result.success("更新成功", true);
        } catch (Exception e) {
            return Result.error("服务器内部错误：" + e.getMessage());
        }
    }

    /**
     * 删除帖子
     * @param id 帖子ID
     * @return 是否成功
     */
    @DeleteMapping("/{id}")
    public Result<Boolean> deletePost(@PathVariable Long id) {
        try {
            boolean deleted = postService.deletePostById(id);
            if (!deleted) {
                return Result.error(500, "删除失败");
            }
            return Result.success("删除成功", true);
        } catch (Exception e) {
            return Result.error("服务器内部错误：" + e.getMessage());
        }
    }

    /**
     * 分页获取所有帖子预览
     * @param page 页码（从0开始）
     * @param size 每页数量
     * @param userType 用户类型（0-普通用户，1-管理员）
     * @return 分页结果，包含帖子列表和总页数等信息
     */
    @GetMapping
    public Result<PageResultVO<PostPreviewVO>> getAllPosts(@RequestParam(defaultValue = "0") int page,
                                                   @RequestParam(defaultValue = "10") int size,
                                                   @RequestParam(defaultValue = "0") int userType,
                                                   @RequestParam(required = false) Long categoryId) {
        try {
            int offset = page * size;
            List<PostPreviewVO> postPreviews;
            long total;
            if (categoryId != null && categoryId > 0) {
                // 分类筛选
                if (userType == 1) {
                    // 管理员，查所有分类下的帖子（不论状态）
                    postPreviews = postService.getAllPostPreviewsByCategory(categoryId, offset, size);
                    total = postService.countAllPostsByCategory(categoryId);
                } else {
                    // 普通用户，只查分类下状态为正常的帖子
                    postPreviews = postService.getPostPreviewsByCategory(categoryId, offset, size);
                    total = postService.countNormalPostsByCategory(categoryId);
                }
            } else {
                // 不筛选分类
                if (userType == 1) {
                    postPreviews = postService.getAllPostPreviews(offset, size);
                    total = postService.countAllPosts();
                } else {
                    postPreviews = postService.getPostPreviews(offset, size);
                    total = postService.countNormalPosts();
                }
            }
            int totalPages = (int) ((total + size - 1) / size);
            PageResultVO<PostPreviewVO> pageResult = new PageResultVO<>();
            pageResult.setRecords(postPreviews);
            pageResult.setPageNum(page);
            pageResult.setPageSize(size);
            pageResult.setTotal(total);
            pageResult.setTotalPages(totalPages);
            return Result.success("查询成功", pageResult);
        } catch (Exception e) {
            return Result.error("服务器内部错误：" + e.getMessage());
        }
    }

    /**
     * 根据关键词搜索帖子
     * @param keyword 关键词
     * @param pageNum 页码
     * @param pageSize 每页数量
     * @return 分页结果
     */
    @GetMapping("/search")
    public Result<PageResultVO<PostVO>> searchPosts(@RequestParam String keyword,
                                                    @RequestParam(defaultValue = "1") int pageNum,
                                                    @RequestParam(defaultValue = "10") int pageSize) {
        try {
            PageResultVO<PostVO> pageResult = postService.searchPosts(keyword, pageNum, pageSize);
            return Result.success("查询成功", pageResult);
        } catch (Exception e) {
            return Result.error("服务器内部错误：" + e.getMessage());
        }
    }


    /**
     * 按分类分页查询帖子
     * @param categoryId 分类ID
     * @param pageNum 页码
     * @param pageSize 每页数量
     * @return 分页结果
     */
    @GetMapping("/category/{categoryId}")
    public PageResultVO<Post> getPostsByCategory(@PathVariable Long categoryId,
                                                 @RequestParam(defaultValue = "1") int pageNum,
                                                 @RequestParam(defaultValue = "10") int pageSize){
        return postService.getPostsByCategory(categoryId, pageNum, pageSize);
    }

    /**
     * 获取当前登录用户所有（正常和隐藏）帖子简要信息
     * @param authorId 当前用户ID
     * @return 帖子简要信息列表
     */
    @GetMapping("/my/all")
    public Result<List<MyPostSimpleVO>> getMyAllPosts(@RequestParam Long authorId) {
        try {
            List<MyPostSimpleVO> list = postService.getMyAllPosts(authorId);
            return Result.success("查询成功", list);
        } catch (Exception e) {
            return Result.error("服务器内部错误：" + e.getMessage());
        }
    }

    /**
     * 分页获取当前用户所有（正常和隐藏）帖子简要信息
     * @param authorId 当前用户ID
     * @param pageNum 页码
     * @param pageSize 每页数量
     * @return 分页结果
     */
    @GetMapping("/my/page")
    public Result<PageResultVO<MyPostSimpleVO>> getMyAllPostsPaged(@RequestParam Long authorId,
                                                                  @RequestParam(defaultValue = "1") int pageNum,
                                                                  @RequestParam(defaultValue = "10") int pageSize) {
        try {
            int offset = (pageNum - 1) * pageSize;
            List<MyPostSimpleVO> records = postService.getMyAllPostsPaged(authorId, offset, pageSize);
            long total = postService.countMyAllPosts(authorId);
            int totalPages = (int) ((total + pageSize - 1) / pageSize);
            PageResultVO<MyPostSimpleVO> pageResult = new PageResultVO<>();
            pageResult.setRecords(records);
            pageResult.setPageNum(pageNum);
            pageResult.setPageSize(pageSize);
            pageResult.setTotal(total);
            pageResult.setTotalPages(totalPages);
            return Result.success("查询成功", pageResult);
        } catch (Exception e) {
            return Result.error("服务器内部错误：" + e.getMessage());
        }
    }
}

